package ex4;



import java.util.ArrayList;
import java.util.List;

/**
 * Representation d'une bibliotheque.
 * @author jujeanpi
 */

public class Bibliotheque {

		private List<Ouvrage> ouvrages;
		private List<Abonne> abonnes;
		
		//Constructeurs
		
		public Bibliotheque(){
			this.setOuvrages(new ArrayList<Ouvrage>());
			this.setAbonnes(new ArrayList<Abonne>());
		}
		public Bibliotheque(List<Ouvrage> ouvrages, List<Abonne>abonnes){
			this.setOuvrages(ouvrages);
			this.setAbonnes(abonnes);
		}
		
		/**
		 * Permet l'emprunt d'un ouvrage.
		 * @param abonne Abonne souhaitant emprunter l'ouvrage.
		 * @param ouvrage Ouvrage ˆ emprunter.
		 * @return true si l'operation s'est bien passŽe, false sinon.
		 * @see #estUnAbonne(Abonne)
		 * @see #estUnOuvrage(Ouvrage)
		 */
		public boolean emprunter(Abonne abonne, Ouvrage ouvrage){
			
			// Verifier que j'ai un ouvrage en argument
			// Pas compris comment effectuer cela.
			
			// Chercher l'ouvrage dans biblio
			
			if(this.estUnAbonne(abonne) && this.estUnOuvrage(ouvrage))
			{
				// Verifier sa disponibilite
				if(ouvrage.estDisponible())
				{
					// On affecte l'ouvrage ˆ l'abonne
					abonne.emprunter(ouvrage);
					
					ouvrage.estEmpruntePar(abonne);					
					// Puis on rend l'ouvrage indisponible
					ouvrage.setDisponibilite(false);
				}
				else
				{
					System.out.println("\n Ouvrage indisponible");
					return false;
				}
			}
			else
			{
				System.out.println("\n Abonne ou ouvrage introuvable");
				return false;
			}
			return true;			
		}
		/**
		 * Permet la reservation d'un ouvrage.
		 * @param abonne abonne souhaitant reserver l'ouvrage.
		 * @param ouvrage l'ouvrage ˆ reserver.
		 * @return true si l'operation s'est bien passŽe, false sinon.
		 * @see #estUnAbonne(Abonne)
		 * @see #estUnOuvrage(Ouvrage)
		 */
		public boolean reserver(Abonne abonne, Ouvrage ouvrage){
			// Si les aboone et ouvrage existe dans les listes de la bibliotheque
			if(this.estUnAbonne(abonne) && this.estUnOuvrage(ouvrage))
			{
				// Test si l'ouvrage n'est pas encore rŽservŽ
				if(!(ouvrage.estReserve()))
				{
					abonne.reserver(ouvrage);
					ouvrage.reserver(true);
				}
				else
				{
					System.out.println("\n Ouvrage dŽjˆ reservŽ");
					return false;
				}
			}
			else{
				System.out.println("\n Abonne ou ouvrage introuvable");
				return false;
			}
			return true;
		}
		/**
		 * Permet la restitution d'un abonne.
		 * @param ouvrage Ouvrage ˆ restituer.
		 * @return true si l'operation s'est bien passŽe, false sinon.
		 * @see #estUnOuvrage(Ouvrage)
		 */
		public boolean restituer(Ouvrage ouvrage){
			// Si les abonnes et ouvrages existent dans les listes de la bibliotheque
			if(this.estUnOuvrage(ouvrage)){
				// On recupere la reference ˆ l'abonne
				Abonne abonne = ouvrage.emprunteur();
				//On supprime l'ouvrage de la liste d'emprunts de l'abonne
				abonne.rendre(ouvrage);
				// L'ouvrage est empruntŽ par personne
				ouvrage.estEmpruntePar(null);
				// l'ouvrage est disponible
				ouvrage.setDisponibilite(true);		
			}
			else{
				System.out.println("\n Ouvrage introuvable");
				return false;
			}
			return true;
		}
		/**
		 * Verifie si l'abonne fait parti de la bibliotheque
		 * @return vrai s'il en fait parti.
		 */
		public boolean estUnAbonne(Abonne abonne){
			return this.abonnes.contains(abonne);
		}
		/**
		 * Verifie si l'ouvrage est contenu dans la bibliotheque
		 * @return vrai s'il est contenu.
		 */
		public boolean estUnOuvrage(Ouvrage ouvrage){
			return this.ouvrages.contains(ouvrage);
		}
		
		public List<Ouvrage> getOuvrages() {
			return ouvrages;
		}
		public void setOuvrages(
				List<Ouvrage> ouvrages) {
			this.ouvrages = ouvrages;
		}
		public List<Abonne> getAbonnes() {
			return abonnes;
		}
		public void setAbonnes(
				List<Abonne> abonnes) {
			this.abonnes = abonnes;
		}
}
